﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace nr.Tombola
{
    /// <summary>
    /// Una partita alla tombola.
    /// </summary>
    public class Game
    {
        /// <summary>
        /// Costruttore.
        /// </summary>
        public Game()
        {
            Bag = new NumbersBag();
            Reset();
        }
        /// <summary>
        /// Il sacchetto dei numeri.
        /// </summary>
        private NumbersBag Bag { get; set; }

        /// <summary>
        /// Indica se la partita è iniziata.
        /// </summary>
        public bool Running { get; private set; }

        /// <summary>
        /// Sequenza dei numeri estratti.
        /// </summary>
        private int[] Sequence { get; set; }

        /// <summary>
        /// Estrae un nuovo numero.
        /// </summary>
        public int Extract()
        {
            if (!Running) return 0;

            if (Bag.MoveNext())
            {
                int index = Bag.Total - Bag.NumbersLeft-1;
                Sequence[index] = Bag.Current;
                return Sequence[index];
            }

            Running = false;
            return 0;
        }

        /// <summary>
        /// Inizializza le variabili prima di cominciare a giocare.
        /// </summary>
        private void Reset()
        {
            Bag.Reset();
            Bag.Shuffle();
            Sequence = new int[Bag.Total];
            Running = false;
        }

        /// <summary>
        /// Inizia una nuova partita.
        /// </summary>
        /// <remarks>Se è in corso una partita, viene terminata.</remarks>
        public void Start()
        {
            if (Running) Stop();
            Reset();
            Running = true;
        }

        /// <summary>
        /// Termina la partita in corso.
        /// </summary>
        public void Stop()
        {
            if (Running) Reset();
        }

        /// <summary>
        /// Forza l'estrazione di un numero.
        /// </summary>
        /// <param name="number">Numero da estrarre dal sacchetto.</param>
        /// <returns>
        /// Restituisce True se è stato possibile effettuare la forzatura nell'estrazione, 
        /// ovvero se il numero non era stato già estratto in precedenza.
        /// </returns>
        public bool Pull(int number)
        {
            return Bag.Pull(number);
        }
    }
}
